package cn.monkey.transport.core;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.function.Predicate;

public interface Inbound {

    /**
     * 关闭连接
     *
     * @return close result
     * 如果执行失败，则通过{@link Mono#error} 取获取错误信息
     */
    Mono<Void> close();

    /**
     * 接收数据
     *
     * @param clazz 数据类型
     * @param p     其他可能屏蔽的数据
     * @param <T>   返回值类型
     * @return Flux<T> 数据流
     * 如果执行失败，则通过{@link Flux#error} 取获取错误信息
     */
    <T> Flux<T> receive(Class<T> clazz, Predicate<T> p);


    /**
     * 接收数据
     *
     * @param clazz 数据类型
     * @param <T>   返回值类型
     * @return Flux<T> 数据流
     * 如果执行失败，则通过{@link Flux#error} 取获取错误信息
     */
    default <T> Flux<T> receive(Class<T> clazz) {
        return this.receive(clazz, t -> true);
    }
}
